<?php

abstract class DBAModel {

    private static $db_host = 'localhost';
    private static $db_user = 'root';
    private static $db_pass = '';
    protected $db_name = 'publicidad';
    protected $query;
    protected $rows = array();
    private $conn;
    private $last_id;

    // métodos abstractos para las clases que hereden
    abstract public function get($id);

    abstract public function set($array_datos);

    abstract public function edit($array_datos);

    abstract public function delete($id);

    /**
     * Método para abrir la conexión con la base de datos
     */
    private function open_connection() {
        try {
            $this->conn = new PDO("mysql:host=" . self::$db_host . ";dbname={$this->db_name}", self::$db_user, self::$db_pass);
        } catch (PDOException $e) {
            die('Error al abrir la conexión: ' . $e->getMessage() . 'Archivo' . $e->getFile() . '[' . $e->getLine() . ']');
        }
    }

    /**
     *  Método para cerrar la conexión
     */
    private function close_connection() {
        unset($this->conn);
    }

    /**
     *  Método para ejecutar Insert, Update o Delete
     */
    protected function execute_single_query() {
        $this->open_connection();
        if (!$this->conn->query($this->query)) {
            $error = $this->conn->errorInfo();
            die('Error al ejecutar la SQL en \'execute_single_query\': ' . $error[2]);
        }
        $this->last_id = $this->conn->lastInsertId();
        $this->close_connection();
    }
    /**
     *  Método para ejecutar Insert, Update o Delete sin mensaje
     */
    protected function execute_single_query_noerror() {
        $this->open_connection();
        if (!$this->conn->query($this->query)) {
            $error = $this->conn->errorInfo();
        }
        $this->last_id = $this->conn->lastInsertId();
        $this->close_connection();
    }

    /**
     * Método para ejecutar SELECT, recupera los datos y los guarda en rows[]
     */
    protected function get_results_from_query() {
        $this->open_connection();
        //conn->query devuelve un PDOStatement que guardamos en $result
        if ($result = $this->conn->query($this->query)) {
            // Vamos cogiendo todas las filas con PDOStatement::fetch pasando como parámetro
            // PDO::FETCH_ASSOC para que devuelva sólo un array asociativo y no numérico
            //Primero limpio la propiedad rows por si contiene ya algún dato
            unset($this->rows);
            while ($this->rows[] = $result->fetch(PDO::FETCH_ASSOC));

            // $this->rows = $result->fetchAll(PDO::FETCH_ASSOC);

            $result->closeCursor();

            $this->close_connection();

            array_pop($this->rows);
        } else {
            $error = $this->conn->errorInfo();
            throw new Exception("Error al ejecutar la SQL en \'get_results_from_query\': " . $error[2]);
        }
    }

    /**
     * Devuelve el último id autonumérico insertado
     * @return int último id autonumérico insertado
     */
    public function get_last_id() {
        return $this->last_id;
    }

}

/**
 * Modelo de datos de administrador.
 *
 */
class Administrador extends DBAModel {

    private $id;
    public $usuario;
    public $password;
    public $nombre;
    public $apellidos;
    public $documento_identidad;
    public $direccion;
    public $localidad;
    public $provincia;
    public $pais;
    public $telefono;
    public $email;
    public $activo;

    /**
     * Obtiene los datos de un administrador y los guarda en las propiedades
     *
     * @param String $email email del administrador que queremos obtener
     * @return Devuelve true si ha encontrado algún administrador y false si no lo ha encontrado
     */
    public function get($email) {
        // Insertamos la query
        $this->query = "SELECT * FROM administradores WHERE email = '$email'";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        if (count($this->rows) == 1) {
            // copiamos los datos del array rows[0] a las propiedades del objeto
            foreach ($this->rows [0] as $propiedad => $valor) {
                //Utiliza "variables variables"
                $this->$propiedad = $valor;
            }
            return true;
        } else {
            return false;
        }
    }

    public function get_by_usuario($usuario) {
        // Insertamos la query
        $this->query = "SELECT * FROM administradores WHERE usuario = '$usuario'";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        if (count($this->rows) == 1) {
            // copiamos los datos del array rows[0] a las propiedades del objeto
            foreach ($this->rows [0] as $propiedad => $valor) {
                //Utiliza "variables variables"
                $this->$propiedad = $valor;
            }
            return true;
        } else {
            return false;
        }
    }

    /**
     * 
     */
    public function get_email() {
        return $this->Email;
    }

    /**
     * Obtiene el ID
     */
    public function getId() {
        return $this->id;
    }

    /**
     * Obtiene los datos de un administrador y los guarda en las propiedades
     *
     * @param int $id email del comercial que queremos obtener
     * @return Devuelve true si ha encontrado algún comercial y false si no lo ha encontrado
     */
    public function get_by_id($id) {
        // Insertamos la query
        $this->query = "SELECT * FROM administradores WHERE id = $id";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        if (count($this->rows) == 1) {
            // copiamos los datos del array rows[0] a las propiedades del objeto
            foreach ($this->rows [0] as $propiedad => $valor) {
                //Utiliza "variables variables"
                $this->$propiedad = $valor;
            }
            return true;
        } else {
            return false;
        }
    }

    /**
     * Función que inserta un nuevo administrador con la clave codificada
     * @param Array $array_datos array asociativo con todos los campos del administrador
     *
     */
    public function set($array_datos = array()) {
        //Creamos variables desde los datos del array
        foreach ($array_datos as $campo => $valor) {
            $$campo = $valor;
        }
        //Codifico el password
        $password = md5($password);
        //Indicamos la query INSERT a ejecutar
        $this->query = "INSERT INTO administradores
                        (usuario,password,nombre,apellidos,documento_identidad, direccion, localidad, provincia, pais, telefono, email, activo) 
                        VALUES 
                        ('$usuario','$password','$nombre','$apellidos','$documento_identidad', '$direccion', '$localidad', '$provincia', '$pais', '$telefono', '$email', $activo)";
        //Ejecutamos la query
        $this->execute_single_query();
    }

    /**
     * Función que inserta un nuevo administrador con la clave codificada
     * @param Array $array_datos array asociativo con campos email, password, nombre
     */
    public function edit($array_datos) {
        //Creamos variables desde los datos del array
        foreach ($array_datos as $campo => $valor) {
            $$campo = $valor;
        }
        //Indicamos la query UPDATE a ejecutar
        $this->query = "UPDATE administradores SET 
                            usuario = '$usuario',
                            password = '$password',
                            nombre = '$nombre',
                            apellidos = '$apellidos',
                            documento_identidad = '$documento_identidad', 
                            direccion = '$direccion', 
                            localidad = '$localidad',
                            provincia = '$provincia', 
                            pais = '$pais', 
                            telefono = '$telefono', 
                            email = '$'$email', 
                            activo = $activo
                        WHERE email = '$email'";

        //ejecutamos la query
        $this->execute_single_query();
    }

    /**
     *
     */
    public function cambiar_clave($id_administrador, $password) {
        //codificamos la contraseña recibida
        $password = md5($password);

        //Indicamos la query UPDATE a ejecutar
        $this->query = "UPDATE administradores SET 
                            password = '$password'
                        WHERE id = $id_administrador;";

        //ejecutamos la query
        $this->execute_single_query();
    }

    /**
     * Metodo no implementado
     * @throws Exception;
     */
    public function delete($email) {
        throw new Exception('Método no implementado');
    }

    /**
     * Comprueba el e-mail y la clave de un administrador
     * @param String $email
     * @param String $clave
     * @return boolean Devuelve true si se ha encontrado al administrador y false
     * si no se ha encontrado
     */
    public function comprobar_login_administrador($email, $password) {
        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
            if ($this->get($email)) {
                if ($this->password == md5($password)) {
                    return true;
                }
            }
            return false;
        } else {
            if ($this->get_by_usuario($email)) {
                if ($this->password == md5($password)) {
                    return true;
                }
            }
            return false;
        }
    }

    /**
     * Comprueba si existe un administrador con ese email
     * @param String $email
     * @return boolean Devuelve true si existe al cliente y false
     * si no se ha encontrado
     */
    public function existe_administrador_email($email) {
        //Guardo la select en query
        $this->query = "SELECT email FROM administradores WHERE email = '$email'";
        // Obtenemos los datos y se guardan en rows[];
        $this->get_results_from_query();
        //Comprobamos que nos ha devuelto una fila
        if (count($this->rows) == 1) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Comprueba si existe un administrador con ese email
     * @param String $email
     * @return boolean Devuelve true si existe al cliente y false
     * si no se ha encontrado
     */
    public function existe_nombre_usuario($usuario) {
        //Guardo la select en query
        $this->query = "SELECT usuario FROM administradores WHERE usuario = '$usuario'";
        // Obtenemos los datos y se guardan en rows[];
        $this->get_results_from_query();
        //Comprobamos que nos ha devuelto una fila
        if (count($this->rows) == 1) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Actualiza el campo fecha_ultimo_acceso de la base de datos
     * @param String $email email del administrador a actualizar
     */
    public function actualizar_fecha_ultimo_acceso($email) {
        $this->query = "UPDATE administradores SET fecha_ultimo_acceso=now()
					WHERE email='$email'";
        $this->execute_single_query();
    }

    /**
     * comprobamos si existe algún administrador cuyo nombre de usuario codificado con md5 coincida con la cookie pasada como parámetro
     * @param String $valor_cookie nombre de usuario codificado con md5
     * @return Devuelve el nombre de usuario si encuentra el usuario y false si no lo encuentra
     */
    public function comprobar_cookie($valor_cookie) {
        $this->query = "select * from administradores where md5(email) = '$valor_cookie'";
        $this->get_results_from_query();
        if (count($this->rows) == 1) {
            return $this->rows[0]['email'];
        } else {
            return false;
        }
    }

}

/**
 * Modelo de datos de Anuncio.
 *
 */
class Anuncio extends DBAModel {

    private $id;
    public $nombre;
    public $descripcion;
    public $imagen;
    public $fecha_publicacion;
    public $activo;
    public $impresiones;
    public $impresiones_dia;
    public $dias_restantes;
    public $contador;
    public $fecha_impresion;
    public $url;
    public $cliente;
    public $tarifa;

    /**
     * Obtiene todos los datos del anuncio
     *
     * @param int $id id del anuncio a mostrar
     *        	
     */
    public function get($id) {
        // Insertamos la query
        $this->query = "SELECT anuncios.*, "
                . "CONCAT(clientes.nombre ,' ', clientes.apellidos) as cliente_nombre, "
                . "clientes.id as cliente_id, "
                . "tarifas.nombre as tarifa_nombre, "
                . "tarifas.id as tarifa_id "
                . "FROM anuncios "
                . "INNER JOIN clientes ON clientes.id = anuncios.cliente "
                . "INNER JOIN tarifas ON tarifas.id = anuncios.tarifa "
                . "WHERE anuncios.id = $id";
        // Obtenemos los datos y se guardan en rows[];
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        if (count($this->rows) == 1) {
            // copiamos los datos del array rows[0] a las propiedades del objeto
            foreach ($this->rows [0] as $propiedad => $valor) {
                // Utiliza "variables variables"
                $this->$propiedad = $valor;
            }
            return true;
        } else {
            return false;
        }
    }

    /**
     * Inserta un anuncio con los datos pasados como parámetro
     *
     * @param array $array_datos array
     *        	asociativo con todos los datos a insertar excepto el id que es autonumérico
     *        	
     */
    public function set($array_datos = array()) {
        // Creamos variables desde los datos del array
        foreach ($array_datos as $campo => $valor) {
            $$campo = $valor;
        }
        // Indicamos la query INSERT a ejecutar
        $this->query = " INSERT INTO anuncios
 				(nombre, descripcion, imagen, fecha_publicacion, activo, impresiones, impresiones_dia, dias_restantes, contador, fecha_impresion, url, cliente, tarifa) 
				VALUES 
				('$nombre', '$descripcion', '$imagen', now(), 0, $impresiones, $impresiones_dia, 0, 0, now(), '$url', $cliente, $tarifa)";
        // Ejecutamos la query
        $this->execute_single_query();


        //Copiamos los nuevos datos a las propiedades del objeto $url
        foreach ($array_datos as $campo => $valor) {
            $this->$campo = $valor;
        }
        //Actualizamos la propiedad id con el último id insertado (autonumérico) 
        $this->id = $this->get_last_id();
    }

    /**
     * Actualiza un anuncio con los datos pasados en el array $array_datos.
     *
     *
     * @param array $array_datos array
     *        	asociativo con todos los datos a insertar. Debe
     *        	incluir el id para saber qué anuncio actualizar, y no debe incluir el
     *        	id ya que no se va a permitir modificarlo.
     */
    public function edit($array_datos = array()) {
        // Creamos variables desde los datos del array
        foreach ($array_datos as $campo => $valor) {
            $$campo = $valor;
        }
        // Indicamos la query UPDATE a ejecutar
        $this->query = " UPDATE anuncios SET 
                                nombre='$nombre',
                                descripcion='$descripcion', 
 				impresiones_dia=$impresiones_dia,
 				url='$url'
                                WHERE id = $id;
 				";
        $this->execute_single_query();

        // Copiamos los nuevos datos a las propiedades del objeto
        foreach ($array_datos as $campo => $valor) {
            $this->$campo = $valor;
        }

        // Actualizamos la propiedad id con el último id insertado (autonumérico)
        $this->id = $this->get_last_id();
    }
    
    public function modificar_imagen($array_datos = array()) {
        // Creamos variables desde los datos del array
        foreach ($array_datos as $campo => $valor) {
            $$campo = $valor;
        }
        // Indicamos la query UPDATE a ejecutar
        $this->query = " UPDATE anuncios SET 
                                imagen='$imagen'
                                WHERE id = $id;
 				";
        $this->execute_single_query();

        // Copiamos los nuevos datos a las propiedades del objeto
        foreach ($array_datos as $campo => $valor) {
            $this->$campo = $valor;
        }

        // Actualizamos la propiedad id con el último id insertado (autonumérico)
        $this->id = $this->get_last_id();
    }

    /**
     * Borra un anuncio
     *
     * @param int $id id
     *        	del anuncio a borrar
     */
    public function delete($id) {
        $this->query = "DELETE FROM anuncios WHERE id = $id ";
        $this->execute_single_query();
    }

    /**
     * Obtiene todos los anuncios de un comercial
     * @param type $comercial
     * @param type $limit
     * @param type $order
     * @return type
     */
    public function get_anuncios_by_comercial($comercial, $limit = 0, $order = 'desc') {
        if ($limit > 0) {
            $limit = "limit $limit";
        } else {
            $limit = "";
        }
        // Insertamos la query
        $this->query = "SELECT a.*, CONCAT(cl.nombre, ' ',cl.apellidos) as clientenombre, t.nombre as tarifanombre
                        FROM anuncios as a
                        INNER JOIN clientes as cl
                        on a.cliente = cl.id
                        INNER JOIN tarifas as t
                        on a.tarifa = t.id
                        INNER JOIN comerciales as co
                        on cl.comercial = co.id
                        WHERE co.id = $comercial
                        ORDER BY id $order $limit";

        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     * Obtiene todos los anuncios de un comercial
     * @param type $comercial
     * @param type $limit
     * @param type $order
     * @return type
     */
    public function get_anuncios_by_cliente($cliente, $limit = 0, $order = 'desc') {
        if ($limit > 0) {
            $limit = "limit $limit";
        } else {
            $limit = "";
        }
        // Insertamos la query
        $this->query = "SELECT a.*, t.nombre as tarifanombre
                        FROM anuncios as a
                        INNER JOIN clientes as cl
                        on a.cliente = cl.id
                        INNER JOIN tarifas as t
                        on a.tarifa = t.id
                        WHERE cl.id = $cliente
                        ORDER BY id $order $limit";

        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     * Método que obtiene todos los anuncios
     * 
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function obtener_todos_anuncios() {
        // Insertamos la query
        $this->query = "SELECT a.*, CONCAT(cl.nombre, ' ',cl.apellidos) as clientenombre, t.nombre as tarifanombre
                        FROM anuncios as a
                        INNER JOIN clientes as cl
                        on a.cliente = cl.id
                        INNER JOIN tarifas as t
                        on a.tarifa = t.id
                        INNER JOIN comerciales as co
                        on cl.comercial = co.id";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     * Método que obtiene todos los anuncios
     * 
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function obtener_todos_anuncios_disponibles() {
        // Insertamos la query
        $this->query = "SELECT * FROM anuncios 
                        WHERE activo = 1 
                        and impresiones > 0 
                        and fecha_impresion = curdate() 
                        and contador > 0 
                        and dias_restantes >= 0
                        or (fecha_impresion < curdate() and impresiones > 0);";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }
    
    /**
     * Método que obtiene todos los anuncios
     * 
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function obtener_anuncios_impresion($country, $site) {
        // Insertamos la query
        $this->query = "SELECT * FROM anunciosimpresion WHERE sitio Like '%$site%' and pais = '$country';";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     * Método para obtener todos los comerciales
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function obtener_numero_anuncios() {
        // Insertamos la query
        $this->query = "SELECT count(*) AS numero FROM anuncios WHERE activo = 1";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }
    
    /**
     * Borra anuncio de anunciosimpresion
     *
     * @param int $id id
     *        	del anuncio a borrar
     */
    public function delete_anunciosimpresion($id) {
        $this->query = "DELETE FROM anunciosimpresion WHERE id = $id ";
        $this->execute_single_query();
    }

    /**
     * Obtiene el valor de la propiedad id actual.
     *
     * @return contenido de la propiedad id del objeto actual
     */
    public function get_id() {
        return $this->id;
    }

    /**
     * Método para obtener los ultimos anuncios
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function obtener_ultimos_anuncios() {
        // Insertamos la query
        $this->query = "SELECT a.*, CONCAT(cl.nombre, ' ',cl.apellidos) as clientenombre, t.nombre as tarifanombre
                        FROM anuncios as a
                        INNER JOIN clientes as cl
                        on a.cliente = cl.id
                        INNER JOIN tarifas as t
                        on a.tarifa = t.id
                        INNER JOIN comerciales as co
                        on cl.comercial = co.id
                        ORDER BY id desc LIMIT 5";

        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }
    
    /**
     * 
     */
    public function activar_anuncio($anuncio){
        $this->query = "UPDATE anuncios SET activo = 1 WHERE id = $anuncio";
        $this->execute_single_query();
    }

    /**
     * 
     */
    public function desactivar_anuncio($anuncio){
        $this->query = "UPDATE anuncios SET activo = 0 WHERE id = $anuncio";
        $this->execute_single_query();
    }
    
    /**
     * Comprueba si el anuncio pertenece al comercial
     *
     * @param int $id id del anuncio a mostrar
     *        	
     */
    public function comprobar_anuncio_comercial($id_anuncio, $id_comercial) {
        // Insertamos la query
        $this->query = "SELECT *
                        FROM anuncios as a
                        INNER JOIN clientes as cl
                        on a.cliente = cl.id    
                        INNER JOIN comerciales as co
                        on cl.comercial = co.id
                        WHERE co.id = $id_comercial AND a.id = $id_anuncio";
        // Obtenemos los datos y se guardan en rows[];
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        if (count($this->rows) == 1) {
            // copiamos los datos del array rows[0] a las propiedades del objeto
            foreach ($this->rows [0] as $propiedad => $valor) {
                // Utiliza "variables variables"
                $this->$propiedad = $valor;
            }
            return true;
        } else {
            return false;
        }
    }
    
    /**
     * Comprueba si el anuncio pertenece al comercial
     *
     * @param int $id id del anuncio a mostrar
     *        	
     */
    public function comprobar_anuncio_cliente($id_anuncio, $id_cliente) {
        // Insertamos la query
        $this->query = "SELECT *
                        FROM anuncios
                        WHERE cliente = $id_cliente AND id = $id_anuncio";
        // Obtenemos los datos y se guardan en rows[];
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        if (count($this->rows) == 1) {
            // copiamos los datos del array rows[0] a las propiedades del objeto
            foreach ($this->rows [0] as $propiedad => $valor) {
                // Utiliza "variables variables"
                $this->$propiedad = $valor;
            }
            return true;
        } else {
            return false;
        }
    }
    
    /**
     * Actualizar cola de anuncios
     */
    public function actualizar_anunciosimpresion() {
        $this->query = "call procActualizaAnunciosImpresion();";
        $this->execute_single_query_noerror();
    }
    
    /**
     * Actualizar fecha anuncios_impresion
     */
    public function actualizar_fecha_anunciosimpresion() {
        $this->query = "UPDATE configuracion SET value = curdate() WHERE name = 'fecha_anunciosimpresion';";
        $this->execute_single_query();
    }
    
    /**
     * Comprobar fecha ultima actualizacion
     */
    public function fecha_ultima_actualizacion(){
         // Insertamos la query
        $this->query = "SELECT value FROM configuracion WHERE name = 'fecha_anunciosimpresion';";
        // Obtenemos los datos y se guardan en rows[];
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        return $this->rows[0]['value'];
    }
    
    /**
     * Método que obtiene todos los anuncios eliminados
     * 
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function obtener_historialanuncios() {
        // Insertamos la query
        $this->query = "SELECT a.*, CONCAT(cl.nombre, ' ',cl.apellidos) as clientenombre, t.nombre as tarifanombre
                        FROM historialanuncios as a
                        INNER JOIN clientes as cl
                        on a.cliente = cl.id
                        INNER JOIN tarifas as t
                        on a.tarifa = t.id
                        INNER JOIN comerciales as co
                        on cl.comercial = co.id";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }
    
    /**
     * Obtiene todos los datos del anuncio
     *
     * @param int $id id del anuncio a mostrar
     *        	
     */
    public function get_historial($id) {
        // Insertamos la query
        $this->query = "SELECT historialanuncios.*, "
                . "CONCAT(clientes.nombre ,' ', clientes.apellidos) as cliente_nombre, "
                . "clientes.id as cliente_id, "
                . "tarifas.nombre as tarifa_nombre, "
                . "tarifas.id as tarifa_id "
                . "FROM historialanuncios "
                . "INNER JOIN clientes ON clientes.id = historialanuncios.cliente "
                . "INNER JOIN tarifas ON tarifas.id = historialanuncios.tarifa "
                . "WHERE historialanuncios.id = $id";
        // Obtenemos los datos y se guardan en rows[];
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        if (count($this->rows) == 1) {
            // copiamos los datos del array rows[0] a las propiedades del objeto
            foreach ($this->rows [0] as $propiedad => $valor) {
                // Utiliza "variables variables"
                $this->$propiedad = $valor;
            }
            return true;
        } else {
            return false;
        }
    }

}

/**
 * Modelo de datos de cliente.
 *
 */
class Cliente extends DBAModel {

    private $id;
    public $usuario;
    public $password;
    public $nombre;
    public $apellidos;
    public $documento_identidad;
    public $direccion;
    public $localidad;
    public $provincia;
    public $pais;
    public $telefono;
    public $email;
    public $cuenta_bancaria;
    public $activo;
    public $comercial;

    /**
     * Obtiene los datos de un cliente y los guarda en las propiedades
     *
     * @param String $email email del cliente que queremos obtener
     * @return Devuelve true si ha encontrado algún cliente y false si no lo ha encontrado
     */
    public function get($email) {
        // Insertamos la query
        $this->query = "SELECT * FROM clientes WHERE email = '$email'";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        if (count($this->rows) == 1) {
            // copiamos los datos del array rows[0] a las propiedades del objeto
            foreach ($this->rows [0] as $propiedad => $valor) {
                //Utiliza "variables variables"
                $this->$propiedad = $valor;
            }
            return true;
        } else {
            return false;
        }
    }

    /**
     * Obtiene los datos de un cliente y los guarda en las propiedades
     *
     * @param String $email email del cliente que queremos obtener
     * @return Devuelve true si ha encontrado algún cliente y false si no lo ha encontrado
     */
    public function get_by_id($id) {
        // Insertamos la query
        $this->query = "SELECT * FROM clientes WHERE id = $id";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        if (count($this->rows) == 1) {
            // copiamos los datos del array rows[0] a las propiedades del objeto
            foreach ($this->rows [0] as $propiedad => $valor) {
                //Utiliza "variables variables"
                $this->$propiedad = $valor;
            }
            return true;
        } else {
            return false;
        }
    }

    /**
     * Obtiene los datos de un cliente y los guarda en las propiedades
     *
     * @param String $email email del cliente que queremos obtener
     * @return Devuelve true si ha encontrado algún cliente y false si no lo ha encontrado
     */
    public function get_by_usuario($usuario) {
        // Insertamos la query
        $this->query = "SELECT * FROM clientes WHERE usuario = '$usuario'";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        if (count($this->rows) == 1) {
            // copiamos los datos del array rows[0] a las propiedades del objeto
            foreach ($this->rows [0] as $propiedad => $valor) {
                //Utiliza "variables variables"
                $this->$propiedad = $valor;
            }
            return true;
        } else {
            return false;
        }
    }

    /**
     * 
     */
    public function get_email() {
        return $this->Email;
    }

    /**
     * Obtiene el ID
     */
    public function getId() {
        return $this->id;
    }

    /**
     * 
     */
    public function get_comercial_by_cliente($cliente_id) {
        // Insertamos la query
        $this->query = "SELECT comercial FROM clientes WHERE id = $cliente_id";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    public function obtener_numero_anuncios($cliente) {
        // Insertamos la query
        $this->query = "SELECT count(*) AS numero_anuncios
                        FROM anuncios
                        WHERE cliente = $cliente";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     * Función que inserta un nuevo cliente con la clave codificada
     * @param Array $array_datos array asociativo con todos los campos del cliente
     *
     */
    public function set($array_datos = array()) {
        //Creamos variables desde los datos del array
        foreach ($array_datos as $campo => $valor) {
            $$campo = $valor;
        }

        //Indicamos la query INSERT a ejecutar
        $this->query = "INSERT INTO clientes
                        (usuario,nombre,apellidos,documento_identidad, direccion, localidad, provincia, pais, telefono, email, cuenta_bancaria, activo, password, comercial) 
                        VALUES 
                        ('$usuario','$nombre','$apellidos','$documento_identidad', '$direccion', '$localidad', '$provincia', '$pais', '$telefono', '$email', '$cuenta_bancaria', 1, '$password', $comercial)";
        //Ejecutamos la query
        $this->execute_single_query();

    }

    /**
     * Función que inserta un nuevo cliente con la clave codificada
     * @param Array $array_datos array asociativo con todos los campos
     */
    public function edit($array_datos) {
        //Creamos variables desde los datos del array
        foreach ($array_datos as $campo => $valor) {
            $$campo = $valor;
        }
        //Indicamos la query UPDATE a ejecutar
        $this->query = "UPDATE clientes SET 
                            usuario = '$usuario',
                            nombre = '$nombre',
                            apellidos = '$apellidos',
                            documento_identidad = '$documento_identidad', 
                            direccion = '$direccion', 
                            localidad = '$localidad',
                            provincia = '$provincia', 
                            pais = '$pais', 
                            telefono = '$telefono', 
                            email = '$email', 
                            cuenta_bancaria = '$cuenta_bancaria', 
                            activo = $activo,
                            comercial = $comercial
                        WHERE email = '$email';";

        //ejecutamos la query
        $this->execute_single_query();
    }

    /**
     * Metodo no implementado
     * @throws Exception;
     */
    public function delete($id) {
        //Indicamos la query UPDATE a ejecutar
        $this->query = "UPDATE clientes SET activo = 0
                        WHERE id = '$id';";

        //ejecutamos la query
        $this->execute_single_query();
    }

    /**
     * Comprueba el e-mail y la clave de un cliente
     * @param String $email
     * @param String $clave
     * @return boolean Devuelve true si se ha encontrado al cliente y false
     * si no se ha encontrado
     */
    public function comprobar_login_clientes($email, $password) {
        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
            if ($this->get($email)) {
                if ($this->password == md5($password)) {
                    return true;
                }
            }
            return false;
        } else {
            if ($this->get_by_usuario($email)) {
                if ($this->password == md5($password)) {
                    return true;
                }
            }
            return false;
        }
    }

    /**
     * Comprueba si existe un cliente con ese email
     * @param String $email
     * @return boolean Devuelve true si existe al cliente y false
     * si no se ha encontrado
     */
    public function existe_cliente_email($email) {
        //Guardo la select en query
        $this->query = "SELECT email FROM clientes WHERE email = '$email'";
        // Obtenemos los datos y se guardan en rows[];
        $this->get_results_from_query();
        //Comprobamos que nos ha devuelto una fila
        if (count($this->rows) == 1) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Comprueba si existe un cliente con ese usuario
     * @param String $email
     * @return boolean Devuelve true si existe al cliente y false
     * si no se ha encontrado
     */
    public function existe_nombre_usuario($usuario) {
        //Guardo la select en query
        $this->query = "SELECT usuario FROM clientes WHERE usuario = '$usuario'";
        // Obtenemos los datos y se guardan en rows[];
        $this->get_results_from_query();
        //Comprobamos que nos ha devuelto una fila
        if (count($this->rows) == 1) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Desactiva el cliente recibido
     * @throws Exception;
     */
    public function desactivar_cliente($id) {
        //Indicamos la query UPDATE a ejecutar
        $this->query = "UPDATE clientes SET activo = 0
                        WHERE id = '$id';";

        //ejecutamos la query
        $this->execute_single_query();
    }

    /**
     * Desactiva el cliente recibido
     * @throws Exception;
     */
    public function activar_cliente($id) {
        //Indicamos la query UPDATE a ejecutar
        $this->query = "UPDATE clientes SET activo = 1
                        WHERE id = '$id';";

        //ejecutamos la query
        $this->execute_single_query();
    }

    /**
     * Actualiza el campo fecha_ultimo_acceso de la base de datos
     * @param String $email email del cliente a actualizar
     */
    public function actualizar_fecha_ultimo_acceso($email) {
        $this->query = "UPDATE clientes SET fecha_ultimo_acceso=now()
					WHERE email='$email'";
        $this->execute_single_query();
    }

    /**
     * comprobamos si existe algún cliente cuyo nombre de usuario codificado con md5 coincida con la cookie pasada como parámetro
     * @param String $valor_cookie nombre de usuario codificado con md5
     * @return Devuelve el nombre de usuario si encuentra el usuario y false si no lo encuentra
     */
    public function comprobar_cookie($valor_cookie) {
        $this->query = "select * from clientes where md5(email) = '$valor_cookie'";
        $this->get_results_from_query();
        if (count($this->rows) == 1) {
            return $this->rows[0]['email'];
        } else {
            return false;
        }
    }

    /**
     * Método para obtener todos los clientes del comercial recibido
     * @param int $comercial id del comercial
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function obtener_todas_tarifas($comercial) {
        // Insertamos la query
        $this->query = "SELECT * FROM tarifas WHERE comercial = $comercial";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     * Método para obtener todos los clientes
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function obtener_todos_clientes() {
        // Insertamos la query
        $this->query = "SELECT * FROM clientes WHERE activo = 1";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     * Método para obtener los ultimos clientes
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function obtener_ultimos_clientes() {
        // Insertamos la query
        $this->query = "SELECT * FROM clientes WHERE activo = 1 ORDER BY id desc LIMIT 5";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     * Método para obtener todos los clientes
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function obtener_todos_clientes_inactivos() {
        // Insertamos la query
        $this->query = "SELECT * FROM clientes WHERE activo = 0";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     * Método para obtener todos los comerciales
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function obtener_numero_clientes() {
        // Insertamos la query
        $this->query = "SELECT count(*) AS numero FROM clientes WHERE activo = 1";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     *
     */
    public function cambiar_clave($id_cliente, $password) {
        //codificamos la contraseña recibida
        $password = md5($password);

        //Indicamos la query UPDATE a ejecutar
        $this->query = "UPDATE clientes SET 
                            password = '$password'
                        WHERE id = $id_cliente;";

        //ejecutamos la query
        $this->execute_single_query();
    }

}

/**
 * Modelo de datos de comercial.
 *
 */
class Comercial extends DBAModel {

    private $id;
    public $usuario;
    public $password;
    public $nombre;
    public $apellidos;
    public $documento_identidad;
    public $direccion;
    public $localidad;
    public $provincia;
    public $pais;
    public $telefono;
    public $email;
    public $cuenta_bancaria;
    public $activo;

    /**
     * Obtiene el ID
     */
    public function getId() {
        return $this->id;
    }

    /**
     * Obtiene los datos de un comercial y los guarda en las propiedades
     *
     * @param String $email email del comercial que queremos obtener
     * @return Devuelve true si ha encontrado algún comercial y false si no lo ha encontrado
     */
    public function get($email) {
        // Insertamos la query
        $this->query = "SELECT * FROM comerciales WHERE email = '$email'";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        if (count($this->rows) == 1) {
            // copiamos los datos del array rows[0] a las propiedades del objeto
            foreach ($this->rows [0] as $propiedad => $valor) {
                //Utiliza "variables variables"
                $this->$propiedad = $valor;
            }
            return true;
        } else {
            return false;
        }
    }

    /**
     * Obtiene los datos de un comercial y los guarda en las propiedades
     *
     * @param int $id email del comercial que queremos obtener
     * @return Devuelve true si ha encontrado algún comercial y false si no lo ha encontrado
     */
    public function get_by_id($id) {
        // Insertamos la query
        $this->query = "SELECT * FROM comerciales WHERE id = $id";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        if (count($this->rows) == 1) {
            // copiamos los datos del array rows[0] a las propiedades del objeto
            foreach ($this->rows [0] as $propiedad => $valor) {
                //Utiliza "variables variables"
                $this->$propiedad = $valor;
            }
            return true;
        } else {
            return false;
        }
    }

    /**
     * Obtiene los datos de un cliente y los guarda en las propiedades
     *
     * @param String $email email del cliente que queremos obtener
     * @return Devuelve true si ha encontrado algún cliente y false si no lo ha encontrado
     */
    public function get_by_usuario($usuario) {
        // Insertamos la query
        $this->query = "SELECT * FROM comerciales WHERE usuario = '$usuario'";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        if (count($this->rows) == 1) {
            // copiamos los datos del array rows[0] a las propiedades del objeto
            foreach ($this->rows [0] as $propiedad => $valor) {
                //Utiliza "variables variables"
                $this->$propiedad = $valor;
            }
            return true;
        } else {
            return false;
        }
    }

    /**
     * Obtiene los datos de un comercial y los guarda en las propiedades
     *
     * @param String $email email del comercial que queremos obtener
     * @return Devuelve true si ha encontrado algún comercial y false si no lo ha encontrado
     */
    public function get_codificado($email) {
        // Insertamos la query
        $this->query = "SELECT id FROM comerciales WHERE md5(email) = '$email'";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        if (count($this->rows) == 1) {
            // copiamos los datos del array rows[0] a las propiedades del objeto
            foreach ($this->rows [0] as $propiedad => $valor) {
                //Utiliza "variables variables"
                $this->$propiedad = $valor;
            }
            return true;
        } else {
            return false;
        }
    }

    /**
     * 
     */
    public function get_email() {
        return $this->Email;
    }

    /**
     * Función que inserta un nuevo comercial con la clave codificada
     * @param Array $array_datos array asociativo con todos los campos del comercial
     *
     */
    public function set($array_datos = array()) {
        //Creamos variables desde los datos del array
        foreach ($array_datos as $campo => $valor) {
            $$campo = $valor;
        }

        //Indicamos la query INSERT a ejecutar
        $this->query = "INSERT INTO comerciales
                        (usuario,nombre,apellidos,documento_identidad, direccion, localidad, provincia, pais, telefono, email, cuenta_bancaria, activo, password) 
                        VALUES 
                        ('$usuario','$nombre','$apellidos','$documento_identidad', '$direccion', '$localidad', '$provincia', '$pais', '$telefono', '$email', '$cuenta_bancaria', 1, '$password')";
        //Ejecutamos la query
        $this->execute_single_query();

    }

    /**
     * Función que inserta un nuevo comercial con la clave codificada
     * @param Array $array_datos array asociativo con campos email, password, nombre
     */
    public function edit($array_datos) {
        //Creamos variables desde los datos del array
        foreach ($array_datos as $campo => $valor) {
            $$campo = $valor;
        }
        //Indicamos la query UPDATE a ejecutar
        $this->query = "UPDATE comerciales SET 
                            usuario = '$usuario',
                            nombre = '$nombre',
                            apellidos = '$apellidos',
                            documento_identidad = '$documento_identidad', 
                            direccion = '$direccion', 
                            localidad = '$localidad',
                            provincia = '$provincia', 
                            pais = '$pais', 
                            telefono = '$telefono', 
                            email = '$email', 
                            cuenta_bancaria = '$cuenta_bancaria', 
                            activo = $activo
                        WHERE email = '$email'";

        //ejecutamos la query
        $this->execute_single_query();
    }

    /**
     * Metodo no implementado
     * @throws Exception;
     */
    public function delete($email) {
        throw new Exception('Método no implementado');
    }

    /**
     * Comprueba el e-mail y la clave de un comercial
     * @param String $email
     * @param String $clave
     * @return boolean Devuelve true si se ha encontrado al comercial y false
     * si no se ha encontrado
     */
    public function comprobar_login_comerciales($email, $password) {
        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
            if ($this->get($email)) {
                if ($this->password == md5($password)) {
                    return true;
                }
            }
            return false;
        } else {
            if ($this->get_by_usuario($email)) {
                if ($this->password == md5($password)) {
                    return true;
                }
            }
            return false;
        }
    }

    /**
     * Comprueba si existe un comercial con ese email
     * @param String $email
     * @return boolean Devuelve true si existe al cliente y false
     * si no se ha encontrado
     */
    public function existe_comercial_email($email) {
        //Guardo la select en query
        $this->query = "SELECT email FROM comerciales WHERE email = '$email'";
        // Obtenemos los datos y se guardan en rows[];
        $this->get_results_from_query();
        //Comprobamos que nos ha devuelto una fila
        if (count($this->rows) == 1) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Comprueba si existe un comercial con ese email
     * @param String $email
     * @return boolean Devuelve true si existe al cliente y false
     * si no se ha encontrado
     */
    public function existe_nombre_usuario($usuario) {
        //Guardo la select en query
        $this->query = "SELECT usuario FROM comerciales WHERE usuario = '$usuario'";
        // Obtenemos los datos y se guardan en rows[];
        $this->get_results_from_query();
        //Comprobamos que nos ha devuelto una fila
        if (count($this->rows) == 1) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Actualiza el campo fecha_ultimo_acceso de la base de datos
     * @param String $email email del comercial a actualizar
     */
    public function actualizar_fecha_ultimo_acceso($email) {
        $this->query = "UPDATE comerciales SET fecha_ultimo_acceso=now()
					WHERE email='$email'";
        $this->execute_single_query();
    }

    /**
     * comprobamos si existe algún comercial cuyo nombre de usuario codificado con md5 coincida con la cookie pasada como parámetro
     * @param String $valor_cookie nombre de usuario codificado con md5
     * @return Devuelve el nombre de usuario si encuentra el usuario y false si no lo encuentra
     */
    public function comprobar_cookie($valor_cookie) {
        $this->query = "select * from comerciales where md5(email) = '$valor_cookie'";
        $this->get_results_from_query();
        if (count($this->rows) == 1) {
            return $this->rows[0]['email'];
        } else {
            return false;
        }
    }

    public function get_clientes_by_comercial($comercial, $limit = 0, $order = 'desc') {
        if ($limit > 0) {
            $limit = "limit $limit";
        } else {
            $limit = "";
        }
        // Insertamos la query
        $this->query = "SELECT * FROM clientes WHERE comercial = $comercial AND activo = 1 ORDER BY id $order $limit";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    public function get_clientes_by_comercial_inactivos($comercial) {
        // Insertamos la query
        $this->query = "SELECT * FROM clientes WHERE comercial = $comercial AND activo = 0";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     * Método para obtener el numero de clientes de un comercial
     * @param int $comercial id del comercial
     *
     */
    public function obtener_numero_clientes($comercial) {
        // Insertamos la query
        $this->query = "SELECT count(*) AS numero FROM clientes WHERE comercial = $comercial AND activo = 1";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     * Método para obtener el numero de anuncios de un comercial
     * @param int $comercial id del comercial
     *
     */

    /**
     * Método para obtener todos los comerciales
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function obtener_todos_comerciales() {
        // Insertamos la query
        $this->query = "SELECT * FROM comerciales WHERE activo = 1";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     * Método para obtener todos los comerciales
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function obtener_numero_comerciales() {
        // Insertamos la query
        $this->query = "SELECT count(*) AS numero FROM comerciales WHERE activo = 1";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     * Método para obtener todos los comerciales
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function obtener_todos_comerciales_inactivos() {
        // Insertamos la query
        $this->query = "SELECT * FROM comerciales WHERE activo = 0";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     * Método para obtener los ultimos comerciales
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function obtener_ultimos_comerciales() {
        // Insertamos la query
        $this->query = "SELECT * FROM comerciales WHERE activo = 1 ORDER BY id desc LIMIT 5";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    public function obtener_numero_anuncios($comercial) {
        // Insertamos la query
        $this->query = "SELECT count(*) as num_anuncios
                        FROM anuncios as a
                        INNER JOIN clientes as cl
                        on a.cliente = cl.id
                        INNER JOIN comerciales as co
                        on cl.comercial = co.id
                        WHERE co.id = $comercial";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     *
     */
    public function cambiar_clave($id_comercial, $password) {
        //codificamos la contraseña recibida
        $password = md5($password);

        //Indicamos la query UPDATE a ejecutar
        $this->query = "UPDATE comerciales SET 
                            password = '$password'
                        WHERE id = $id_comercial;";

        //ejecutamos la query
        $this->execute_single_query();
    }

    /**
     * Desactiva el comercial recibido
     * @throws Exception;
     */
    public function desactivar_comercial($id) {
        //Indicamos la query UPDATE a ejecutar
        $this->query = "UPDATE comerciales SET activo = 0
                        WHERE id = '$id';";

        //ejecutamos la query
        $this->execute_single_query();
    }

    /**
     * Desactiva el comercial recibido
     * @throws Exception;
     */
    public function activar_comercial($id) {
        //Indicamos la query UPDATE a ejecutar
        $this->query = "UPDATE comerciales SET activo = 1
                        WHERE id = '$id';";

        //ejecutamos la query
        $this->execute_single_query();
    }

}

/**
 * Modelo de datos de Historial de anuncios.
 *
 */
class Historialanuncio extends DBAModel {

    private $id;
    public $nombre;
    public $descripcion;
    public $imagen;
    public $fecha_publicacion;
    public $fecha_eliminacion;
    public $comercial;
    public $cliente;
    public $tarifa;

    /**
     * Obtiene todos los datos del anuncio del historial
     *
     * @param int $id id del anuncio
     *        	
     */
    public function get($id) {
        // Insertamos la query
        $this->query = "SELECT * FROM historialanuncios WHERE id = '$id'";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        if (count($this->rows) == 1) {
            // copiamos los datos del array rows[0] a las propiedades del objeto
            foreach ($this->rows [0] as $propiedad => $valor) {
                //Utiliza "variables variables"
                $this->$propiedad = $valor;
            }
            return true;
        } else {
            return false;
        }
    }

    /**
     * Metodo no implementado
     * @throws Exception;
     */
    public function set($array_datos) {
        throw new Exception('Método no implementado');
    }

    /**
     * Metodo no implementado
     * @throws Exception;
     */
    public function edit($array_datos) {
        throw new Exception('Método no implementado');
    }

    /**
     * Metodo no implementado
     * @throws Exception;
     */
    public function delete($email) {
        throw new Exception('Método no implementado');
    }

}

/**
 * Modelo de datos de Paises.
 *
 */
class Paises extends DBAModel {

    private $codigo;
    public $nombre;

    /**
     * Obtiene todos los datos del país recibido
     *
     * @param String $codigo codigo del país
     * Devuelve true si existe el país o false si no.
     *        	
     */
    public function get($codigo) {
        // Insertamos la query
        $this->query = "SELECT * FROM paises WHERE codigo = '$codigo'";
        // Obtenemos los datos y se guardan en rows[];
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        if (count($this->rows) == 1) {
            // copiamos los datos del array rows[0] a las propiedades del objeto
            foreach ($this->rows [0] as $propiedad => $valor) {
                // Utiliza "variables variables"
                $this->$propiedad = $valor;
            }
            return true;
        } else {
            return false;
        }
    }

    /**
     * Metodo no implementado
     * @throws Exception;
     */
    public function set($array_datos) {
        throw new Exception('Método no implementado');
    }

    /**
     * Metodo no implementado
     * @throws Exception;
     */
    public function edit($array_datos) {
        throw new Exception('Método no implementado');
    }

    /**
     * Metodo no implementado
     * @throws Exception;
     */
    public function delete($email) {
        throw new Exception('Método no implementado');
    }

    /**
     * Metodo para listar todos los paises
     * @return type
     */
    public function listar_paises() {
        // Insertamos la query
        $this->query = "SELECT * FROM paises ORDER BY nombre";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

}

/**
 * Modelo de datos de Sitios.
 *
 */
class Sitio extends DBAModel {

    private $id;
    public $nombre;
    public $descripcion;
    public $url;

    /**
     * Obtiene todos los datos del sitio
     *
     * @param int $id id del sitio
     *        	
     */
    public function get($id) {
        // Insertamos la query
        $this->query = "SELECT * FROM sitios WHERE id = '$id'";
        // Obtenemos los datos y se guardan en rows[];
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        if (count($this->rows) == 1) {
            // copiamos los datos del array rows[0] a las propiedades del objeto
            foreach ($this->rows [0] as $propiedad => $valor) {
                // Utiliza "variables variables"
                $this->$propiedad = $valor;
            }
            return true;
        } else {
            return false;
        }
    }

    /**
     * Inserta un sitio con los datos pasados como parámetro
     *
     * @param array $array_datos array
     *        	asociativo con todos los datos a insertar excepto el id que es autonumérico
     *        	
     */
    public function set($array_datos = array()) {
        // Creamos variables desde los datos del array
        foreach ($array_datos as $campo => $valor) {
            $$campo = $valor;
        }
        // Indicamos la query INSERT a ejecutar
        $this->query = " INSERT INTO sitios
 				(nombre, descripcion, url) 
				VALUES 
				('$nombre', '$descripcion', '$url')";
        // Ejecutamos la query
        $this->execute_single_query();


        //Copiamos los nuevos datos a las propiedades del objeto 
        foreach ($array_datos as $campo => $valor) {
            $this->$campo = $valor;
        }
        //Actualizamos la propiedad id con el último id insertado (autonumérico) 
        $this->id = $this->get_last_id();
    }

    /**
     * Actualiza un sitio con los datos pasados en el array $array_datos.
     *
     *
     * @param Array $array_datos array
     *        	asociativo con todos los datos a insertar. Debe
     *        	incluir el id para saber qué sitio actualizar.
     *          El id no se va a permitir modificarlo.
     */
    public function edit($array_datos = array()) {
        // Creamos variables desde los datos del array
        foreach ($array_datos as $campo => $valor) {
            $$campo = $valor;
        }
        // Indicamos la query UPDATE a ejecutar
        $this->query = " UPDATE sitios SET 
                                nombre='$nombre',
                                descripcion='$descripcion', 
 				url='$url'
                                WHERE id = $id;
 				";
        $this->execute_single_query();

        // Copiamos los nuevos datos a las propiedades del objeto
        foreach ($array_datos as $campo => $valor) {
            $this->$campo = $valor;
        }

        // Actualizamos la propiedad id con el último id insertado (autonumérico)
        $this->id = $this->get_last_id();
    }

    /**
     * Borra un sitio
     *
     * @param int $id id
     *        	de la sitio a borrar
     */
    public function delete($id) {
        $this->query = "DELETE FROM sitios WHERE id = $id ";
        $this->execute_single_query();
    }

    /**
     * 
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function obtener_todos_sitios() {
        // Insertamos la query
        $this->query = "SELECT * FROM sitios";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     * Obtiene el valor de la propiedad id actual.
     *
     * @return contenido de la propiedad id del objeto actual
     */
    public function get_id() {
        return $this->id;
    }

}

/**
 * Modelo de datos de tarifas.
 *
 */
class Tarifa extends DBAModel {

    private $id;
    public $nombre;
    public $descripcion;
    public $precio;
    public $activa;
    public $fecha_inicio;
    public $fecha_fin;
    public $impresiones;
    public $pais;
    public $sitio;

    /**
     * Obtiene todos los datos de la tarifa
     *
     * @param int $id id
     *        	de la tarifa que queremos cargar sus datos.
     */
    public function get($id) {
        // Insertamos la query
        $this->query = "SELECT t.*, p.nombre as paisnombre, s.nombre as sitionombre "
                . "FROM tarifas as t "
                . "INNER JOIN paises as p "
                . "ON t.pais = p.codigo "
                . "INNER JOIN sitios as s "
                . "ON t.sitio = s.id "
                . "WHERE t.id = '$id'";
        // Obtenemos los datos y se guardan en rows[];
        $this->get_results_from_query();
        // comprobamos si ha devuelto una sola fila
        if (count($this->rows) == 1) {
            // copiamos los datos del array rows[0] a las propiedades del objeto
            foreach ($this->rows [0] as $propiedad => $valor) {
                // Utiliza "variables variables"
                $this->$propiedad = $valor;
            }
            return true;
        } else {
            return false;
        }
    }

    /**
     * Inserta una tarifa con los datos pasados como parámetro
     *
     * @param Array $array_datos array
     *        	asociativo con todos los datos a insertar excepto el id que es autonumérico
     *        	
     */
    public function set($array_datos = array()) {
        // Creamos variables desde los datos del array
        foreach ($array_datos as $campo => $valor) {
            $$campo = $valor;
        }
        // Indicamos la query INSERT a ejecutar
        $this->query = " INSERT INTO tarifas
 				(nombre,descripcion,precio,fecha_inicio, fecha_fin, impresiones, pais, sitio, activa) 
				VALUES 
				('$nombre', '$descripcion', $precio, '$fecha_inicio', '$fecha_fin', $impresiones, '$pais', $sitio, $activa)";
        // Ejecutamos la query
        $this->execute_single_query();


        //Copiamos los nuevos datos a las propiedades del objeto 
        foreach ($array_datos as $campo => $valor) {
            $this->$campo = $valor;
        }
        //Actualizamos la propiedad id con el último id insertado (autonumérico) 
        $this->id = $this->get_last_id();
    }

    /**
     * Actualiza una tarifa con los datos pasados en el array $array_datos.
     *
     *
     * @param Array $array_datos array
     *        	asociativo con todos los datos a insertar. Debe
     *        	incluir el id para saber qué tarifa actualizar, 
     * El id se va a permitir modificarlo.
     */
    public function edit($array_datos = array()) {
        // Creamos variables desde los datos del array
        foreach ($array_datos as $campo => $valor) {
            $$campo = $valor;
        }
        // Indicamos la query UPDATE a ejecutar
        $this->query = "UPDATE tarifas SET 
                            nombre='$nombre', 
                            descripcion='$descripcion', 
                            precio=$precio,
                            activa=$activa,
                            fecha_inicio='$fecha_inicio',
                            fecha_fin='$fecha_fin',
                            impresiones = $impresiones,
                            pais = '$pais',
                            sitio = $sitio
                        WHERE id = $id ";
        $this->execute_single_query();

        // Copiamos los nuevos datos a las propiedades del objeto
        foreach ($array_datos as $campo => $valor) {
            $this->$campo = $valor;
        }

        // Actualizamos la propiedad id con el último id insertado (autonumérico)
        $this->id = $this->get_last_id();
    }

    /**
     * Borra una tarifa
     *
     * @param int $id id
     *        	de la tarifa a borrar
     */
    public function delete($id) {
        $this->query = "UPDATE tarifas SET 
                            activa=$activa
                        WHERE id = $id";
        $this->execute_single_query();
    }

    /**
     * Desactiva la tarifa recibido
     * @throws Exception;
     */
    public function desactivar($id) {
        //Indicamos la query UPDATE a ejecutar
        $this->query = "UPDATE tarifas SET activa = 0
                        WHERE id = '$id';";

        //ejecutamos la query
        $this->execute_single_query();
    }

    /**
     * Desactiva la tarifa recibido
     * @throws Exception;
     */
    public function activar($id) {
        //Indicamos la query UPDATE a ejecutar
        $this->query = "UPDATE tarifas SET activa = 1
                        WHERE id = '$id';";

        //ejecutamos la query
        $this->execute_single_query();
    }

    /**
     * 
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function obtener_todas_tarifas() {
        // Insertamos la query
        $this->query = "SELECT * FROM tarifas";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     * 
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function get_tarifas_activas() {
        // Insertamos la query
        $this->query = "SELECT tarifas.*, sitios.nombre as sitionombre
                        FROM tarifas 
                        INNER JOIN sitios
                        ON sitios.id = tarifas.sitio
                        WHERE tarifas.activa = 1";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }
    
    /**
     * 
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function get_tarifas_activas_completa() {
        // Insertamos la query
        $this->query = "SELECT t.*, p.nombre as paisnombre, s.nombre as sitionombre "
                . "FROM tarifas as t "
                . "INNER JOIN paises as p "
                . "ON t.pais = p.codigo "
                . "INNER JOIN sitios as s "
                . "ON t.sitio = s.id "
                . "WHERE t.activa = 1;";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     * 
     * @return array Devuelve un array de 2 dimensiones con todas las filas del
     * resultado
     */
    public function get_tarifas_inactivas() {
        // Insertamos la query
        $this->query = "SELECT tarifas.*, sitios.nombre as sitionombre
                        FROM tarifas 
                        INNER JOIN sitios
                        ON sitios.id = tarifas.sitio
                        WHERE tarifas.activa = 0";
        // Obtenemos los datos y se guardan en rows[]
        $this->get_results_from_query();
        return $this->rows;
    }

    /**
     * Obtiene el valor de la propiedad id actual.
     *
     * @return contenido de la propiedad id del objeto actual
     */
    public function get_id() {
        return $this->id;
    }

}

?>